跳到主要内容

1078.Bigram 分词

· 阅读需 3 分钟

1、题干

给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。

对于每种这样的情况,将第三个词 "third" 添加到答案中,并返回答案。

 

示例 1:

输入:text = "alice is a good girl she is a good student", first = "a", second = "good"
输出:["girl","student"]

示例 2:

输入:text = "we will we will rock you", first = "we", second = "will"
输出:["we","rock"]

 

提示:

  • 1 <= text.length <= 1000
  • text 由小写英文字母和空格组成
  • text 中的所有单词之间都由 单个空格字符 分隔
  • 1 <= first.length, second.length <= 10
  • first 和 second 由小写英文字母组成

2、解题思路

  • 正则:使用正则表达式匹配满足条件的单词即可
    • 代码最少,但要注意处理好单词边界(\b
  • 拆分数组:将字符串按空格拆分为字符串数组,遍历并判断连续的两个单词是否符合条件即可
    • 逻辑简单易懂,坑比较少
  • 直接遍历:以空格为标识,判断已遍历的单词数量、以及是否跟 first second相等即可
    • 代码略多,边界情况较多,容易踩坑

3、代码1 - 正则

var findOcurrences = function (text, first, second) {
return text.match(new RegExp(`(?<=\\b${first} ${second} )[a-z]+`, 'g')) || [];
};

4、代码2 - 拆分数组

var findOcurrences = function (text, first, second) {
const words = text.split(' ');
return words.reduce((acc, cur, i) => {
if (cur === second && words[i - 1] === first && words[i + 1]) acc.push(words[i + 1]);
return acc;
}, []);
};

5、代码3 - 直接遍历

var findOcurrences = function (text, first, second) {
let word = '', found = 0, res = [];
for (let i = 0; i < text.length; i++) {
if (text[i] !== ' ') {
word += text[i];
if (i < text.length - 1) continue;
}
if (found === 2) res.push(word), found = word === second && word === first ? 2 : (word === first ? 1 : 0);
else if (found === 1) found = word === second ? 2 : (word === first ? 1 : 0);
else if (found === 0) found = word === first ? 1 : 0;
word = '';
}

return res;
};

6、执行结果

1.png